package com.kamistoat.netty.nio;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 仅仅使用一个Buffer对文件进行复制
 */
public class NIOFileChannel03 {
    public static void main(String[] args) throws Exception {
        // 文件读取channel
        File file =
                new File("/home/kamistoat/ubuntu/Netty_Learning/src/main/java/com/kamistoat/netty/nio/file01.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        FileChannel inChannel = fileInputStream.getChannel();

        // 文件输出channel
        FileOutputStream fileOutputStream =
                new FileOutputStream("/home/kamistoat/ubuntu/Netty_Learning/src/main/java/com/kamistoat/netty/nio/file02.txt");
        FileChannel outChannel = fileOutputStream.getChannel();

        // 仅使用一个buffer，且不限制buffer的容量为文件大小
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        while (true) {
            // 每次读取前对buffer执行初始化。非常重要!!!
            // 解释: 在这个while循环中，read执行完毕(position=read.len, limit=capacity)，flip执行完毕(position=0,limit=read.len)
            // write执行完毕(position=limit=read.len)
            // 此时如果不执行初始化，接着去read，那么read的结果将永远是0，即channel认为连接没有关闭但是也没有传输数据
            // 而在执行clear后，position=0, limit=capacity, 此时再read要么是数据要么是-1
            byteBuffer.clear();

            // 从inChannel中读取数据写入到buffer, 当文件读取完毕相当于BIO中Socket关闭链接，read的结果就是-1
            int read = inChannel.read(byteBuffer);
            if (read == -1) {
                break;
            }
            // 直接将buffer中已经存在的数据写入到outChannel中
            byteBuffer.flip();
            outChannel.write(byteBuffer);
        }

        fileInputStream.close();
        fileOutputStream.close();
    }
}
